#include "ListaABM.h"
#include <limits>

using namespace ABM;

//Cuando llamo al constructor de IAbm , le seteo el nombre del ABM en el que estoy.
ListaABM::ListaABM() :
	IAbm("Lista") {
	this->manejadorEleccion = new ManejadorEleccion();
	this->manejadorLista = new ManejadorLista();
}

bool ListaABM::alta() {

	bool resultado = false;

	bool existenLosIdentificadoresExternos = true;

	int fecha = -1;
	string cargo = "";
	string nombre = "";

	cout << "Ingrese la FECHA de la eleccion: ";
	cin >> fecha;
	cin.ignore(numeric_limits<streamsize>::max(), '\n');
	cout << "Ingrese el CARGO de la eleccion: ";
	getline(cin, cargo);
	cargo = Utils::aMinuscula(cargo);
	existenLosIdentificadoresExternos = this->manejadorEleccion->existe(fecha,
			cargo);

	if (existenLosIdentificadoresExternos) {
		cout << "Ingrese el NOMBRE de la LISTA: ";
		getline(cin, nombre);
		nombre = Utils::aMinuscula(nombre);
		resultado = altaInterna(fecha, cargo, nombre);
	} else {
		cout << "Elección Inexistente . ." << endl;
		resultado = false;
		getchar();
	}

	return resultado;
}

bool ListaABM::altaInterna(int fecha, string cargo, string nombre){
	bool resultado = false;
	Lista* listaAInsertar = new Lista();
	listaAInsertar->setEleccion(fecha, cargo);
	listaAInsertar->setNombre(nombre);

	if (manejadorLista->alta(listaAInsertar)) {
		resultado = true;
	} else
		resultado = false;

	delete listaAInsertar;
	return resultado;
}

bool ListaABM::baja() {

	bool resultado = false;

	bool existenLosIdentificadoresExternos = true;

	int fecha = -1;
	string cargo = "";
	string nombre = "";

	cout << "Ingrese la FECHA de la eleccion: ";
	cin >> fecha;
	cin.ignore(numeric_limits<streamsize>::max(), '\n');
	cout << "Ingrese el CARGO de la eleccion: ";
	getline(cin, cargo);
	cargo = Utils::aMinuscula(cargo);
	if (existenLosIdentificadoresExternos) {
		cout << "Ingrese el NOMBRE de la LISTA: " << endl;
		getline(cin, nombre);
		nombre = Utils::aMinuscula(nombre);

		Lista* listaABorrar = new Lista();
		listaABorrar->setEleccion(fecha, cargo);
		listaABorrar->setNombre(nombre);

		if (this->manejadorLista->baja(listaABorrar)) {
			resultado = true;
		}

		delete listaABorrar;
	} else {
		cout << "No existe el cargo" << endl;
		getchar();
		resultado = false;
	}

	return resultado;

}

bool ListaABM::modificacion() {

	cout << "Las LISTAS no tiene campos modificables" << endl;
	getchar();

	return false;

}

void ListaABM::altaMasiva() {
	ArchivoAltasMasivas* arch = new ArchivoAltasMasivas(
			"listaCargaMasiva.txt");
	string linea;
	Lista* lista;
	vector<string>* campos;

	linea = arch->leerLinea();

	while (!arch->finDeArchivo()) {
		lista = new Lista();
		campos = Parser::separarCampos(&linea, separadorCampos);
		int fecha = 0;
		string cargo;

		//si no tiene tres elementos, estaba mal la línea del archivo, lo descarto
		if (campos->size() == 3) {
			for (unsigned int i = 0; i < campos->size(); ++i) {
				Parser::reemplazarCaracter(&campos->at(i), separadorPalabras, blanco);
			}
			fecha = atoi(campos->at(0).c_str());
			cargo = Utils::aMinuscula(campos->at(1));
			if(this->manejadorEleccion->existe(fecha, cargo)){
				altaInterna(fecha, cargo, Utils::aMinuscula(campos->at(2)));
			}
		}
		fecha = 0;
		cargo.clear();
		delete lista;
		delete campos;
		linea = arch->leerLinea();
		this->log->escribir("Se genero Alta Masiva de Lista.");
	}
	delete arch;
}

ListaABM::~ListaABM() {
	delete this->manejadorEleccion;
	delete this->manejadorLista;
}
